// config/wechat.go
package config

import (
	"encoding/json"
	"fmt"
	"os"
)

// WechatConfig 微信小程序配置
type WechatConfig struct {
	AppID      string `json:"appid"`
	AppSecret  string `json:"appsecret"`
	Page       string `json:"page"`        // 小程序页面路径
	Width      int    `json:"width"`       // 二维码宽度
	EnvVersion string `json:"env_version"` // 环境版本
	Query      string `json:"query"`       // 小程序页面路径参数
}

// LoadWechatConfig 加载微信配置
func LoadWechatConfig() (*WechatConfig, error) {
	configFile := "config/wechat.json"

	// 如果配置文件不存在，创建示例配置文件
	if !fileExists(configFile) {
		if err := createWechatConfigExample(configFile); err != nil {
			return nil, fmt.Errorf("创建示例配置文件失败: %v", err)
		}
		return nil, fmt.Errorf("请先配置微信小程序信息，配置文件: %s", configFile)
	}

	// 读取配置文件
	data, err := os.ReadFile(configFile)
	if err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %v", err)
	}

	var config WechatConfig
	if err := json.Unmarshal(data, &config); err != nil {
		return nil, fmt.Errorf("解析配置文件失败: %v", err)
	}

	// 验证必要的配置项
	if config.AppID == "" || config.AppID == "your_appid_here" {
		return nil, fmt.Errorf("请配置正确的微信小程序AppID")
	}
	if config.AppSecret == "" || config.AppSecret == "your_appsecret_here" {
		return nil, fmt.Errorf("请配置正确的微信小程序AppSecret")
	}

	// 设置默认值
	if config.Page == "" {
		config.Page = "pages/order/detail"
	}
	if config.Width == 0 {
		config.Width = 280
	}
	if config.EnvVersion == "" {
		config.EnvVersion = "release"
	}
	return &config, nil
}

// createWechatConfigExample 创建示例配置文件
func createWechatConfigExample(filename string) error {
	// 确保目录存在
	if err := os.MkdirAll("config", 0755); err != nil {
		return err
	}

	exampleConfig := WechatConfig{
		AppID:      "wxb1607e598296a8a2",
		AppSecret:  "674a3c24c8c1b12c3cc4a58deffe0e02",
		Page:       "pages/login/storeShare",
		Query:      "id=20",
		Width:      280,
		EnvVersion: "release",
	}

	data, err := json.MarshalIndent(exampleConfig, "", "  ")
	if err != nil {
		return err
	}

	return os.WriteFile(filename, data, 0644)
}

// fileExists 检查文件是否存在
func fileExists(filename string) bool {
	_, err := os.Stat(filename)
	return !os.IsNotExist(err)
}
